﻿#pragma once
#include "zyCtrol.h"
#include "zyEditBox.h"
#include "zyLmageList.h"

namespace DarkMoonUI {

	class zyTreeView : public  zyCtrol
	{
	public:
		zyTreeView();
		~zyTreeView();
		
		static void  WINAPI zyTreeView_Destroy(zyObject* obj);
		static LRESULT WINAPI zyTreeView_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled);
		static LRESULT WINAPI zyTreeView_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle);
		BOOL 创建(HWND 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		BOOL 创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		HTREEITEM 加入项目(HTREEITEM 参数_父项目句柄, const std::wstring& 参数_项目文本, int 参数_图片索引, int 参数_选择图片索引, INT_PTR 参数_项目数值, int 参数_加入方式);
		void 扩展(HTREEITEM 参数_项目句柄);
		void 收缩(HTREEITEM 参数_项目句柄);
		HTREEITEM 插入项目(HTREEITEM 参数_父项目句柄, HTREEITEM 参数_项目句柄, const std::wstring& 参数_项目文本, int 参数_图片索引 = -1, int 参数_选择图片索引 = -1, INT_PTR 参数_项目数值 = 0);
		bool 绑定(HWND 参数_父窗口, int 参数_资源ID, bool 参数_使用默认字体 = true);
		bool 绑定窗口句柄(HWND 参数_窗口句柄);
		HTREEITEM 取项目句柄(int 参数_标志, HTREEITEM 参数_项目句柄 = 0) { return (HTREEITEM)sendMsg(TVM_GETNEXTITEM, 参数_标志, (LPARAM)参数_项目句柄); }
		void 枚举项目句柄(std::vector<HTREEITEM>& 参数_项目句柄数组);
		int 取项目数() { return (int)sendMsg(TVM_GETCOUNT, 0, 0); }
		int 取缩进层次(HTREEITEM 参数_项目句柄);
		std::wstring 取项目文本(HTREEITEM 参数_项目句柄);
		int 取图片(HTREEITEM 参数_项目句柄);
		int 取状态图片(HTREEITEM 参数_项目句柄);
		int 取选择图片(HTREEITEM 参数_项目句柄);
		INT_PTR 取项目数值(HTREEITEM 参数_项目句柄);
		bool 置项目文本(HTREEITEM 参数_项目句柄, const std::wstring& 参数_欲置入的项目文本);
		bool 置图片(HTREEITEM 参数_项目句柄, int 参数_图片索引);
		bool 置状态图片(HTREEITEM 参数_项目句柄, int 参数_图片索引);
		bool 置选择图片(HTREEITEM 参数_项目句柄, int 参数_图片索引);
		bool 置项目数值(HTREEITEM 参数_项目句柄, INT_PTR 参数_欲置入的项目数值);
		void 保证显示(HTREEITEM 参数_项目句柄);
		TVITEMEX 取项目数据(HTREEITEM 参数_项目句柄);
		RECT 取项目矩形(HTREEITEM 参数_项目句柄, bool 参数_是否只包含标题);
		bool 删除项目(HTREEITEM 参数_项目句柄) { return sendMsg(TVM_DELETEITEM, 0, (LPARAM)参数_项目句柄) != 0; }
		void 清空() { sendMsg(TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); }
		HTREEITEM 取父项目(HTREEITEM 参数_项目句柄) { return (HTREEITEM)sendMsg(TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)参数_项目句柄); }
		bool 是否有子项目(HTREEITEM 参数_项目句柄);
		bool 是否已扩展(HTREEITEM 参数_项目句柄);
		bool 加粗(HTREEITEM 参数_项目句柄);
		bool 取消加粗(HTREEITEM 参数_项目句柄);
		void 进入编辑(HTREEITEM 参数_项目句柄) { sendMsg(TVM_EDITLABELW, 0, (LPARAM)参数_项目句柄); }
		bool 是否选中(HTREEITEM 参数_项目句柄);
		bool 置检查框状态(HTREEITEM 参数_项目句柄, int 参数_状态);
		int 取检查框状态(HTREEITEM 参数_项目句柄);
		void 置现行选中项(HTREEITEM 参数_项目句柄) { sendMsg(TVM_SELECTITEM, TVGN_CARET, (LPARAM)参数_项目句柄); }
		INT_PTR 取现行选中项() { return sendMsg(TVM_GETNEXTITEM, TVGN_CARET, 0); }
		int 取可显示数() { return (int)sendMsg(TVM_GETVISIBLECOUNT, 0, 0); }
		int 取可视第一项() { return (int)sendMsg(TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0); }
		int 取所有选中项(std::vector<INT_PTR>& 参数_选中项数组);
		bool 排序子项(HTREEITEM 参数_项目句柄) { return sendMsg(TVM_SORTCHILDREN, 0, (LPARAM)参数_项目句柄) != 0; }
		bool 排序子项回调(HTREEITEM 参数_项目句柄, void* 参数_排序子程序, int 参数_排序参数);
		bool 标志插入(HTREEITEM 参数_项目句柄, int 参数_插入位置);
		bool 标志删除() { return sendMsg(TVM_SETINSERTMARK, 0, 0) != 0; }
		int 标志置颜色(int 参数_颜色值) { return (int)sendMsg(TVM_SETINSERTMARKCOLOR, 0, 参数_颜色值); }
		int 标志取颜色() { return (int)sendMsg(TVM_GETINSERTMARKCOLOR, 0, 0); }
		void 置图片组(zyLmageList& 参数_图片组, int 参数_类型 = 0);
		zyLmageList* 取图片组(int 参数_类型);
		zyLmageList 创建拖放图片组(HTREEITEM 参数_项目句柄);
		INT_PTR 取坐标项目(int 参数_横向坐标, int 参数_纵向坐标, int& 参数_位置信息);
		int 取子项数(HTREEITEM 参数_项目句柄);
		int 取所有子项目(HTREEITEM 参数_项目句柄, std::vector<HTREEITEM>& 参数_子项目句柄数组, bool 参数_递归);
		std::wstring 取结束编辑文本();
		zyEditBox* 取编辑框();
		int 项目高度(int 参数_高度 = NULL);
		int 缩进距离(int 参数_距离 = NULL);
		int 文本色(int 参数_颜色值 = NULL);
		int 背景色(int 参数_颜色值 = NULL);
		int 连线色(int 参数_颜色值 = NULL);
		//@备注 函数 整型 OnSelChanged(HWND hWnd,INT_PTR 项目句柄,整型 选择方式【0：未知  1：鼠标  2：键盘】)
		void 事件_项目被选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnSelChanged", 参数_事件指针); }
		//@备注 函数 整型 OnDBClick(HWND hWnd)
		void 事件_双击项目(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnDBClick", 参数_事件指针); }
		//@备注 返回值：整型【0允许编辑，1禁止编辑】函数 整型 OnBeginEdit(HWND hWnd,INT_PTR 项目句柄,整型 标题[Unicode文本指针-1]) 
		void 事件_开始编辑(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnBeginEdit", 参数_事件指针); }
		//@备注 返回值：整型【0允许编辑，1禁止编辑】函数 整型 OnEndEdit(HWND hWnd,INT_PTR 项目句柄,整型 标题[Unicode文本指针-1])
		void 事件_结束编辑(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnEndEdit", 参数_事件指针); }
		//@备注 返回值：整型【0允许扩展，1禁止扩展】函数 整型 OnItemExpand(HWND hWnd,INT_PTR 项目句柄)
		void 事件_即将扩展(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnItemExpand", 参数_事件指针); }
		//@备注 返回值：整型【0允许收缩，1禁止收缩】函数 整型 OnItemCollapse(HWND hWnd,INT_PTR 项目句柄)
		void 事件_即将收缩(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnItemCollapse", 参数_事件指针); }
		//@备注 返回值：整型【0默认处理】 函数 整型 OnRClick(HWND hWnd,INT_PTR 项目句柄)
		void 事件_右键单击项目(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnRClick", 参数_事件指针); }
		//@备注 函数 整型 OnCheckChange(HWND hWnd,INT_PTR 项目句柄,整型 检查框状态)
		void 事件_检查框状态被改变(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnCheckChange", 参数_事件指针); }
		//@备注 返回值：整型【0默认处理】 函数 整型 OnClick(HWND hWnd,INT_PTR 项目句柄)
		void 事件_左键单击项目(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnClick", 参数_事件指针); }
	protected:
		void OnNCDestroy();
		
	};

}

